package com.Oct_Eighteen;


/**
 * 463. 岛屿的周长
 * 给定一个 row x col 的二维网格地图 grid ，其中：grid[i][j] = 1 表示陆地， grid[i][j] = 0 表示水域。
 *
 * 网格中的格子 水平和垂直 方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
 *
 * 岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
 *
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/island-perimeter
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 2022/10/18 23:05
 */

public class Solution463 {

    public int islandPerimeter(int[][] grid) {
        for (int i=0;i<grid.length;i++)
        {
            for (int j=0;j<grid[0].length;j++)
            {
                if (grid[i][j]==1)
                {
                    return dfs(i,j,grid);
                }
            }
        }
        return 0;
    }

    int dfs(int i,int j,int[][] grid){
        if (i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]==0)
        {
            return 1;
        }
        if (grid[i][j]==2)
        {
            return 0;
        }
        grid[i][j]=2;
        return dfs(i-1,j,grid)+dfs(i+1,j,grid)+dfs(i,j-1,grid)+dfs(i,j+1,grid);
    }

    public static void main(String[] args) {
        Solution463 solution463=new Solution463();
        System.out.println(solution463.islandPerimeter(new int[][]{{0,1,0,0},{1,1,1,0},{0,1,0,0},{1,1,0,0}}));
    }
}
